package icu.javayanglei.util.fastdfs;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import icu.javayanglei.entity.Wallpaper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件下载
 *
 * @author yang
 * @version 1.0.0
 * @date 2020-10-17 15:32
 */
@Slf4j
@Component
public class FastdfsUtil {
    @Autowired
    protected FastFileStorageClient storageClient;

    /**
     * 获取最热壁纸（第一页）
     *
     * @return List<String>
     */
    public List<Wallpaper> topList() {
        return topList(1);

    }

    /**
     * 获取指定的一页的壁纸的 URL list
     *
     * @param pageSize 指定的页数
     * @return 壁纸 URL list
     */
    public List<Wallpaper> topList(Integer pageSize) {
        // 获取首页
        String url = "https://wallhaven.cc/toplist?page=";
        String listContent = HttpUtil.get(url + pageSize);
        log.debug("url {}", url + pageSize);
        // 壁纸 首页 地址
        //使用正则获取所有标题
        List<String> titles =
                ReUtil.findAll("<a class=\"preview\" href=\"(.*?)\""
                        , listContent,
                        1);
        // <a class="preview" href="https://wallhaven.cc/w/eymzjk" target="_blank" title="" style=""></a>

        List<Wallpaper> images = new ArrayList<Wallpaper>();
        // 放置图片地址的list

        for (String title : titles) {
            log.debug(" title {}", title);
            // 遍历标题
            String s1 = HttpUtil.get(title);
            // 使用正则，获取所有的图片链接地址
            String all = ReUtil.findAll("<img id=\"wallpaper\" src=\"(.*?)\"", s1, 1).get(0);
            // <img id="wallpaper" src="https://w.wallhaven.cc/full/13/wallhaven-13vym3.jpg"
            log.debug("图片链接 ：{}", all);
            final Wallpaper wallpaper = Wallpaper.builder()
                    .remoteUrl(all)
                    .name(FileNameUtil.getName(all))
                    .build();
            // 添加到 图片链接 集合
            images.add(wallpaper);
        }
        return images;
    }

    /**
     * 上传文件
     *
     * @param file 要上传的文件
     * @return 文件位置：group1/M00/00/00/rBkq7F-5JB6AOlpNAAAAFvznsbY.test.t
     */
    public String upload(File file) {
        final FileReader fileReader = new FileReader(file);
        log.debug("文件上传");
        final StorePath storePath = storageClient.uploadFile(fileReader.getInputStream(), file.length(), FileNameUtil.getName(file), null);
        log.debug(" 文件位置 {}", storePath);
        return storePath.getFullPath();
    }

    /**
     * 下载
     *
     * @param id 文件 id
     * @return void
     */
    public void download(String id, OutputStream os) {
        final StorePath storePath = StorePath.parseFromUrl(id);
        log.debug("下载文件");
        final InputStream inputStream = storageClient.downloadFile(
                storePath.getGroup(),
                storePath.getPath(),
                in -> in
        );
        IoUtil.copy(inputStream, os, 3192);
        log.debug("下载完成！！！");
    }

    /**
     * 根据 URL 上传文件到 服务器上
     *
     * @param url 文件路径
     * @return group1/M00/00/00/rBkq7F-6F1CAQRGvABEXdFVm2CE.hutool 文件链接
     */
    public String uploadFileByUrl(String url) {
        String catalog = "/tmp";
        final File tmp = FileUtil.file(catalog);
        log.debug(" tmp {}", tmp);
        // 创建临时文件
        final File tempFile = FileUtil.createTempFile(tmp, true);
        log.debug(" 临时文件 {}", tempFile);
        HttpUtil.downloadFile(url, tempFile);
        log.debug(" 下载后的文件 {}", tempFile);
        final String upload = upload(tempFile);
        log.debug(" 路径为 ：{}", upload);
        return upload;
    }


}
